package main

import (
	"context"
	"fmt"
)

func main() {
	gen := func(ctx context.Context) <-chan int {
		dst := make(chan int)
		n := 1
		go func() { // 一个 select 语句中，Go语言会按顺序从头至尾评估每一个发送和接收的语句。
			for {
				select {
				// main goruntine退出后，基于main启动的goruntine也会会都会关闭,
				// 无法验证打印信息，需要在main goruntine 调用cancel()后，让main goruntine sleep
				case <-ctx.Done():
					fmt.Println("cancel...")
					return // return结束该goroutine，防止泄露
				case dst <- n:
					n++
				}
			}
		}()
		return dst
	}
	ctx, cancel := context.WithCancel(context.Background())
	defer cancel() // 当我们取完需要的整数后调用cancel
	for n := range gen(ctx) {
		fmt.Println(n)
		if n == 3 {
			break
		}
	}
	/**
	cancel() // 当我们取完需要的整数后调用cancel
	time.Sleep(time.Second)
	**/
}
